package com.esender.api.filter.impl;

import com.esender.api.client.BeaconCacheClient;
import com.esender.api.filter.CheckFilter;
import com.esender.common.constant.ApiConstant;
import com.esender.common.constant.CacheConstant;
import com.esender.common.enums.ExceptionEnums;
import com.esender.common.exception.ApiException;
import com.esender.common.model.StandardSubmit;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.Map;
import java.util.Set;

@Service(value = "template")
@Slf4j
public class TemplateCheckFilter implements CheckFilter {
    private static final String TEMPLATE_TEXT = "templateText";
    private static final String TEMPLATE_PLACEHODER = "#";
    @Autowired
    private BeaconCacheClient beaconCacheClient;
    @Override
    public void check(StandardSubmit standardSubmit) {
        // 从submit中获取到短信内容，签名信息，签名id
        log.info("【接口模块-校验模板】   校验ing…………");
        String text = standardSubmit.getText();
        String sign = standardSubmit.getSign();
        Long signId = standardSubmit.getSignId();
        // 将短信内容中的签名直接去掉，获取短信具体内容
        text = text.replace(ApiConstant.SIGN_PREFIX + sign + ApiConstant.SIGN_SUFFIX, "");
        // 从缓存中获取到签名id绑定的所有模板
        Set<Map> templates = beaconCacheClient.smember(CacheConstant.CLIENT_TEMPLATE + signId);
        if (null != templates && !templates.isEmpty()){
            // 遍历签名绑定的所有模板信息
            for (Map template:templates) {
                // 将模板内容和短信具体内容做匹配-true-匹配成功
                String templateText = (String)template.get(TEMPLATE_TEXT);
                // TODO:这里应该是有bug，当发送短信内容是：您的验证码是#code#。如非本人操作，请忽略本短信，这样子与模板配置是一样得，这样子不就通过可以发出去了。
                if (templateText.equals(text)){
                    // 短信具体内容和模板是匹配的。
                    log.info("【接口模块-校验模板】   校验模板通过 templateText = {}",templateText);
                    return;
                }
                // 判断模板中是否只包含一个变量，如果是，直接让具体短信内容匹配前缀和后缀
                // 例子：您的验证码是123434。如非本人操作，请忽略本短信
                // 例子：您的验证码是#code#。如非本人操作，请忽略本短信
                if (!StringUtils.isEmpty(templateText)  && templateText.contains(TEMPLATE_PLACEHODER) && (templateText.length() - templateText.replace(TEMPLATE_PLACEHODER, "").length() == 2)){
                    // 可以确认模板不为空，并且包含#符号，而且#符号有2个，代表是一个占位符（变量）。
                    // 获取模板撇去占位符之后的前缀和后缀
                    String templateTextPrefix = templateText.substring(0,templateText.indexOf(TEMPLATE_PLACEHODER));
                    String templateTextSuffix = templateText.substring(templateText.lastIndexOf("#") + 1);
                    if (text.startsWith(templateTextPrefix) && text.endsWith(templateTextSuffix)){
                        // 当前的短信内容匹配短信模板
                        log.info("【接口模块-校验模板】   校验模板通过 templateText = {}",templateText);
                        return;
                    }
                }
            }
        }
        // 模板校验失败
        throw new ApiException(ExceptionEnums.ERROR_TEMPLATE);
    }
}
